/**
 * 1. 解释判断类型方式
 * toString() 方法返回一个表示该对象的字符串。
 * 每个对象都有一个toString方法，当对象被表示为一个文本值或一个字符串方式引用时，
 * 自动被调用。默认情况下，toString()方法被每个Object对象继承，如果该方法未被自定义覆盖，
 * 就返回"[object type]",其中type是对象的类型。
 *
 * 2.  Object.prototype.toString.call(target)
 *  A.call( B,x,y )：就是把A的函数放到B中运行，x 和 y 是A方法的参数。
 *  让 this 的指向转换
 *  	function minus(x, y) {
			console.log("x - y ",x - y, this);
		}

        function add(x, y) {
		    console.log("x + y" , x + y, this);
	    }

        minus.call(add, 1, 2); // -1 this =====> add

        minus(1,2); // -1  this =====> Window
 *
 * 3. type => target => judgeType(target) === `[object ${type}]`
 * 对外不提供 type 的使用
 * 对外提供 target 的是使用
 *
 * 4. 当然 es5 提供了 Array.isArray()
 */


/**
 * @description: 调用参数原型的toString方法
 * @param {any} target 需要判断的属性
 * @return {string}
 */
const judgeType = (target) => Object.prototype.toString.call(target);

/**
 * @description: 返回一个判断类型的函数
 * @param {string} type 需要判断的属性类型
 * @return {function} 判断该属性的函数
 */
const isType = type => target => judgeType(target) === `[object ${type}]`;

export const isNull = isType('Null');
export const isDate = isType('Date');
export const isArray = isType('Array');
export const isString = isType('String');
export const isNumber = isType('Number');
export const isObject = isType('Object');
export const isPromise = isType('Promise');
export const isFunction = isType('Function');
export const isUndefined = isType('Undefined');
export const isBoolean = isType('Boolean');
